package com.xdw.permissionslib.mylibrary;

import ohos.app.AbilityContext;
import ohos.app.Context;
import ohos.bundle.IBundleManager;

import java.util.ArrayList;
import java.util.List;

/**
 * lazy模式的权限工具类，权限控制过于简单化，体验差，正式项目建议不要使用，通常可以用来编写demo项目
 * 该工具类在Ability视图初始化之前就调用权限校验，无需再做权限校验结果的回调，而是在该工具类中统一处理
 * 权限拒绝则toast提示并且关闭当前Ability，成功不做任何操作。
 * 由于是在视图初始化之前就进行了权限校验，因此后续操作不用再关心权限问题，直接编写自己需要的业务
 */
public class LazyPermissionsUtils {
    private static final String TAG = LazyPermissionsUtils.class.getName();
    //定义权限请求识别码
    private static final int PERMISSION_REQUEST_CODE = 1;
    //定义实例
    private static LazyPermissionsUtils lazyPermissionsUtils;
    //定义context实例
    private static AbilityContext abilityContext;

    private LazyPermissionsUtils() {
    }

    /**
     * 获取LazyPermissionsUtils单例
     *
     * @return LazyPermissionsUtils
     */
    public static synchronized LazyPermissionsUtils getInstance(AbilityContext context) {
        if (lazyPermissionsUtils == null) {
            lazyPermissionsUtils = new LazyPermissionsUtils();
        }
        abilityContext=context;
        return lazyPermissionsUtils;
    }

    /**
     * checkPermissions
     *
     * @param context context
     * @param permissions 需要申请的权限集合
     */
    public void checkPermissions(Context context, String[] permissions) {
        List<String> applyPermissions = new ArrayList<>();

        for (String element : permissions) {
            if (context.verifySelfPermission(element) != IBundleManager.PERMISSION_GRANTED) {
                if (context.canRequestPermission(element)) {
                    LogUtil.warn(TAG, "需要申请权限:" + element);
                    applyPermissions.add(element);
                }
                //禁止授权还不提示的情形
                if (!context.canRequestPermission(element)) {
                    //禁止授权还不提示的情形
                    LogUtil.warn(TAG, "禁止授权并且系统不再提示:" + element);
                    ToastUtil.toast(abilityContext,"您拒绝了授权并且禁止系统再提示，请手动去系统设置页面设置应用权限");
                    //关闭应用
                    abilityContext.terminateAbility();
                }
            }
        }

        if (!applyPermissions.isEmpty()) {
            //主动申请授权，会自动触发系统弹出提供给用户确认
            context.requestPermissionsFromUser(applyPermissions.toArray(new String[0]), PERMISSION_REQUEST_CODE);
        }

    }


    /**
     * 在需要鉴权的Ability中的onRequestPermissionsFromUserResult方法调用此方法
     * 该方法必须调用，否则无法之前鉴权通过之后的回调
     *
     * @param requestCode  requestCode
     * @param permissions  permissions
     * @param grantResults grantResults
     */
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (permissions == null || permissions.length == 0 || grantResults == null || grantResults.length == 0) {
            return;
        }
        for (int grantResult : grantResults) {
            if (grantResult != IBundleManager.PERMISSION_GRANTED) {
                //执行权限拒绝之后的回调
                //禁止授权还不提示的情形
                LogUtil.warn(TAG, "您拒绝了授权，请重新授权");
                ToastUtil.toast(abilityContext,"您拒绝了授权，请重新授权");
                //关闭应用
                abilityContext.terminateAbility();
                return;
            }
        }
    }

}
